package libs

import (
	"context"
	"fmt"
	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	jaegercfg "github.com/uber/jaeger-client-go/config"
)

var (
	tracer opentracing.Tracer
)

func tracerInit() error {
	// 配置
	cfg := jaegercfg.Configuration{
		Sampler: &jaegercfg.SamplerConfig{ // 标准配置
			Type:  jaeger.SamplerTypeConst,
			Param: 1, // 0 | 1 0: 不采样，1:全部采样
		},
		Reporter: &jaegercfg.ReporterConfig{
			LogSpans:           true,                                                       // 发送日志到到服务器上要不要打印日志
			LocalAgentHostPort: fmt.Sprintf("%s:%d", TracerConfig.Host, TracerConfig.Port), // jaeger 服务器配置
		},
		ServiceName: AppConfig.Name, // 服务名称，一般就是服务名称
	}

	// 创建跟踪链
	_tracer, _, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger)) // jaegercfg.Logger(jaeger.StdLogger) 表示使用标准输出，把日志输出屏幕，也可以设置输出到文件
	//defer func() {
	//	if closeErr := closer.Close(); err != nil {
	//		panic(closeErr)
	//	}
	//}()

	tracer = _tracer

	return err
}

func GetTracer() opentracing.Tracer {
	return tracer
}

// CreateSpanContext 创建span Context
func CreateSpanContext(ctx context.Context, parentSpan interface{}) context.Context {
	return context.WithValue(ctx, "parentSpan", parentSpan)
}

// GetContextSpan 在context中获取span
func GetContextSpan(ctx context.Context) opentracing.Span {
	return ctx.Value("parentSpan").(opentracing.Span)
}

// CreateChildSpan 基于父的 context 创建子的span
func CreateChildSpan(operationName string, ctx context.Context) opentracing.Span {
	parentSpan := GetContextSpan(ctx)
	return tracer.StartSpan(operationName, opentracing.ChildOf(parentSpan.Context()))
}
